const {app, BrowserWindow, BrowserView, ipcMain, session, net, webContents, nativeImage, Tray, Menu, MenuItem} = require('electron')
const path = require('path')
const fs = require('fs');
const {spawn, execFile} = require('child_process');
// const robot = require("robotjs");

// const schedule = require("node-schedule");
// const Base64 = require('js-base64').Base64;
// const urlparse = require('url');
// const http = require('http');
// const https = require('https');
const system = require('./js/system');
const core = require('./js/core')
const logger = require('./js/logger')
const netRequest = require('./js/netRequest')
const config = require('./config')
const api_base_path = 'http://127.0.0.1:28081/'  //不知道为啥，这里在windows中不能写localhost
const index_page = 'web/index.html'
//const index_page = 'http://localhost:8080/'
// const index_page = 'https://www.moyin.com'


//全局变量区域,后面通过界面操作
// var proxy = false;    //是否代理
// var r_cookie = false;    //是否需要远程cookie
// var take_task_timer = '*/1 * * * * *';
// var monitor_win_timer = '*/2 * * * * *';
let devModel = false;
let childProcesses = [];
let mainWindow = null;
// let processTask = {};

//end

const rootPath = path.resolve(__dirname);
console.log('root path:', rootPath);
logger.info(`app root path=${rootPath}`);
// 获取传递给 Electron 进程的参数
// const args = process.argv.slice(2); // 忽略前两个参数（'electron-forge' 和 'start'）
// // const { role } = require('./args.json');
// console.log('传递给 Electron 进程的参数:', args);


function createMainWindow(htmlFile) {
    htmlFile = htmlFile || index_page
    if (!mainWindow) {

        mainWindow = new BrowserWindow({
            width: 1100, height: 900, show: true,
            webPreferences: {
                webviewTag: true,
                // preload: path.join(__dirname, 'preload-new.js')
                preload: path.join(rootPath, 'preload.js')
            }
        })
        if (devModel) {
            mainWindow.webContents.openDevTools({mode: 'bottom'});
        }


        // 创建右键菜单
        // const contextMenu = new Menu();
        // contextMenu.append(new MenuItem({
        //     label: '刷新', click: () => {
        //         core.mainForeRefresh();
        //
        //     }
        // }));
        //
        // // 将右键菜单应用到窗口
        // mainWindow.webContents.on('context-menu', (e, params) => {
        //     contextMenu.popup(mainWindow, params.x, params.y);
        // });

        // 监听强制刷新事件(这里只能通过html 一个按钮事件触发，view 中的 fore reload 不能触发)
        // ipcMain.on('force-refresh', function () {
        //     core.mainForeRefresh();
        // });
    }
    //last

    // 设置代理服务器地址和端口
    // const proxyServer = config.remote_http_proxy_url;
    //
    //
    // session.defaultSession.setProxy({
    //     proxyRules: proxyServer,
    //     proxyBypassRules: 'localhost'
    // }, () => {
    //     console.log('代理服务器设置完成')
    // });

    if (!htmlFile.startsWith('http')) {
            mainWindow.loadFile(htmlFile).then(function () {
                core.indexPageLoaded();
            });
        } else {
            mainWindow.loadURL(htmlFile).then(function () {
                core.indexPageLoaded();
            });
        }
    mainWindow.maximize();

    // if(system.isWindow()){
    //     mainWindow.loadURL('http://localhost:28081')
    // }else{
    //     mainWindow.loadURL('http://localhost:3001/')
    // }

    // app.commandLine.appendSwitch('enable-webview-tag', 'true');


    // createWin(45);
}


function init() {
    // 监听主进程的全局未捕获异常
    process.on('uncaughtException', (error) => {
        console.error('Main Process Uncaught Exception:', error);
        // 在此处添加你的异常处理逻辑
    });


    core.start({rootPath: rootPath, devModel: devModel, mainWindow: mainWindow, proxy: false});


}


// 单实例判断
const gotTheLock = app.requestSingleInstanceLock()
if (!gotTheLock) {
    app.quit()
} else {
    app.on('second-instance', (event, commandLine, workingDirectory) => {
        // 当运行第二个实例时,将会聚焦到myWindow这个窗口
        if (mainWindow) {
            if (isWindowHidden(mainWindow)) {
                mainWindow.show();
            }
            mainWindow.focus();
        }
    })
}


function backendLiveStatusCheck(successCallback) {
    var timestamp = Date.now();
    let reqUrl = api_base_path + 'system/liveStatus?' + timestamp;
    //reqUrl = "https://wwww.baidu.com/"
    netRequest.request({url: reqUrl, method: 'GET'}).then(function (result) {
        // console.log(result);
        console.info("backend status check ok,entry main window")
        successCallback();
    }).catch(function (e) {
        //失败不停地检测
        console.warn("backend status check not read,try again in 500ms")
        setTimeout(function () {
            backendLiveStatusCheck(successCallback)
        }, 500)
    })
}

function mainWindowInit() {

    createMainWindow()

    app.on('activate', function () {
        if (BrowserWindow.getAllWindows().length === 0) createMainWindow()
        if (mainWindow) {
            if (isWindowHidden(mainWindow)) {
                mainWindow.show();
            }
            mainWindow.focus();
        }
    })


    // 创建系统托盘图标
    const iconPath = path.join(__dirname, './build/icons/icon.png');
    console.log('tray image', iconPath);
    let appTray = new Tray(iconPath);
    // const image = nativeImage.createFromPath('./build/icons/icon.icns')
    // let appTray = new Tray(image);
    // const iconPath = path.join(__dirname, './build/icons/icon');

    // 创建一个菜单来控制窗口的最小化和关闭
    const contextMenu = Menu.buildFromTemplate([
        {
            label: '显示',
            click: () => {
                mainWindow.show();
            }
        },
        {
            label: '关闭',
            click: () => {
                core.closeMainWindow(function () {
                    app.exit();
                });
            }
        }
    ]);

    // 将菜单分配给托盘图标
    appTray.setToolTip('我的应用');
    appTray.setContextMenu(contextMenu);

    // 监听双击托盘图标事件
    appTray.on('double-click', () => {
        mainWindow.show();
    });

    // 监听窗口关闭事件
    mainWindow.on('close', (event) => {
        event.preventDefault();
        mainWindow.hide();
    });

    // 监听窗口关闭后的事件
    mainWindow.on('closed', () => {
        mainWindow = null;
        app.quit();
    });
}

app.whenReady().then(() => {

    // 获取默认语言设置
    const defaultLocale = app.getLocale();
    console.log('Default Locale:', defaultLocale);


    // 手动设置默认语言
    // app.setLocale('zh-CN'); // 设置为英语（美国）
    // app.commandLine.appendSwitch('lang', 'zh-CN')

    createMainWindow('loading.html')

    init(); //创建window之前执行，因为要初始化python httpServer,不然vue intDtaList 拿不到数据,(ps 有 liveStatus 又可以了)


    backendLiveStatusCheck(function(){
        mainWindowInit();
    })

})

app.on('window-all-closed', function () {
    if (process.platform !== 'darwin') app.quit()
})

// 当 Electron 应用程序准备退出时，强制终止所有子进程
app.on('before-quit', () => {
    for (const child of childProcesses) {
        // 使用 SIGKILL 信号强制终止子进程
        child.kill('SIGKILL');
    }
});

function isWindowHidden(window) {
    // 检查窗口是否最小化
    const isMinimized = window.isMinimized();

    // 检查窗口是否隐藏到托盘
    // const isTrayHidden = window.isVisible() && !window.isFocused();

    return isMinimized || !window.isVisible();
}

// function getOsPlatform() {
//     let osPlatform = process.platform == 'darwin' ? 'mac' : 'win';
//     return osPlatform;
// }

function getExecuteResourcesPath(filePath) {
    let osPlatform = system.getOsPlatform();
    let executeFilePath = path.join(__dirname, 'resources/' + osPlatform + "/" + filePath);
    return executeFilePath;
}

function getResourcesPath(filePath) {
    let executeFilePath = path.join(__dirname, 'resources/' + filePath);
    return executeFilePath;
}

function exec_system_file(executeFilePath, params, callback) {
    // params = params || {}
    // Python可执行文件的路径（根据您的项目结构进行调整）
    // let osPlatform = process.platform == 'darwin' ? 'mac' : 'win';
    let pythonExecutable = path.join(__dirname, 'resources/' + system.getOsPlatform() + "/" + executeFilePath);

    // 要传递给Python脚本的参数（如果需要）
    let pythonArgs = [];
    if (params) {
        pythonArgs = pythonArgs.concat(params)
        // pythonArgs = [params.startDate, params.endDate];

    }

    console.log('executeFilePath,params', pythonExecutable, pythonArgs);
    // 启动Python脚本
    const child = spawn(pythonExecutable, pythonArgs);

    child.stdout.on('data', (data) => {
        console.log(`script stdout: ${data}`);
    });

    child.stderr.on('data', (data) => {
        console.log(`script stderr: ${data}`);
    });

    child.on('close', (code) => {
        console.log(`child process exited with code ${code}`);
    });


    // const child = execFile(pythonExecutable, pythonArgs, (error, stdout, stderr) => {
    //     if (error) {
    //         console.error(`执行脚本时出错: ${error}`);
    //         // mainWindow.webContents.send('query-result', error);
    //         return;
    //     }
    //
    //     if (callback) {
    //         callback(stdout)
    //     }
    //     // mainWindow.webContents.send('query-result', stdout);
    //
    //     // 标准输出(stdout)包含Python脚本的执行结果
    //     console.log(`脚本执行结果: ${stdout}`);
    //
    //     // 如果有错误输出(stderr)，可以在这里处理
    //     if (stderr) {
    //         console.error(`脚本错误输出: ${stderr}`);
    //         // mainWindow.webContents.send('query-result', stderr);
    //     }
    // });
    //
    // // 监听Python脚本的退出事件
    // child.on('exit', (code) => {
    //     console.log(`脚本退出，退出码: ${code}`);
    //     // mainWindow.webContents.send('query-result', code);
    // });
    childProcesses.push(child)
}

